#include "widget.h"
#include "ui_widget.h"

#include "page.h"
#include "ui_page.h"

/*ctrl + alt + p折叠全部*/
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    connect(ui->srcTree, &QTreeWidget::itemExpanded, this, [=](QTreeWidgetItem *item){ //让子文件夹可以打开的
        if (item->childCount() == 0) { // 或者您可以使用自定义标记检查
            QString path = item->data(0, Qt::UserRole).toString(); // 假设我们以此方式存储了路径
            // 注意传递树控件指针，当前项作为父项，以及路径
            populateTreeWidgetWithDirs(item->treeWidget(), item, path);
        }
    });

    // 连接 QTreeWidget 的 itemClicked 信号到槽函数
    connect(ui->treeWidget, &QTreeWidget::itemClicked, [=](QTreeWidgetItem *item, int column) {
        // 获取点击的子项在 QTreeWidget 中的索引
        int index = ui->treeWidget->indexOfTopLevelItem(item);

        // 切换到相应的 QStackedWidget 子页面
        ui->stackedWidget->setCurrentIndex(index+2); //加2是因为有2页初始页
    });
}


Widget::~Widget()
{
    delete ui;
}

void Widget::populateTreeWidgetWithDirs(QTreeWidget *treeWidget, QTreeWidgetItem *parentItem, const QString &path) {

    // 设置为单选模式
    treeWidget->setSelectionMode(QAbstractItemView::SingleSelection);

    QDir dir(path);
    dir.setFilter(QDir::NoDotAndDotDot | QDir::AllDirs); // 排除"."和".."，只列出目录
    QStringList dirs = dir.entryList();
    for (const QString &dirName : dirs) {
    QTreeWidgetItem *item = new QTreeWidgetItem(parentItem);
    // 设置树状条目的图标
    QIcon folderIcon = QApplication::style()->standardIcon(QStyle::SP_DirIcon);
    item->setIcon(0, folderIcon); // 假设这个条目代表一个目录
    item->setText(0, dirName); // 设置目录名
    item->setData(0, Qt::UserRole, path + "/" + dirName); // 存储完整路径以便稍后使用
    if(parentItem == nullptr) { // 如果是顶层目录，添加到treeWidget
            treeWidget->addTopLevelItem(item);
    }

    // 延迟加载子目录，只有在项目展开时才加载
    item->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
    }
}

void Widget::on_srcBtn_clicked() //点击“选择源文件夹按钮”，出现文件树
{
    QString directoryPath = "/";
    QDir directory(directoryPath);

    populateTreeWidgetWithDirs(ui->srcTree,nullptr, directoryPath);

    return;
}

void Widget::on_newTaskBtn_clicked() //点击“新建任务”按钮，出现弹窗，创建新任务放入任务TreeWidget
{
    // 弹出对话框
    QDialog dialog;
    QVBoxLayout layout(&dialog);

    QLabel label("任务名称:");
    QLineEdit lineEdit;

    layout.addWidget(&label);
    layout.addWidget(&lineEdit);

    // 创建确定和取消按钮
    QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);

    connect(&buttonBox, &QDialogButtonBox::accepted, [&]() {    // 连接按钮的点击事件到槽函数
        // 获取输入的任务名称
        QString taskName = lineEdit.text();

        // 创建新的 QTreeWidgetItem
        QTreeWidgetItem *newItem = new QTreeWidgetItem(ui->treeWidget);
        newItem->setText(0, taskName);

        // 创建新的 Page 类实例
        Page *newPage = new Page;

        // 将新页面实例添加到 QStackedWidget 中
        ui->stackedWidget->addWidget(newPage);
        // 关闭对话框
        dialog.close();
    });

    connect(&buttonBox, &QDialogButtonBox::rejected, [&]() { // 取消按钮被点击，关闭对话框
        dialog.close();
    });

    // 将按钮组添加到布局中
    layout.addWidget(&buttonBox);

    // 显示对话框
    dialog.exec();
}

void Widget::on_delTaskBtn_clicked()
{
    // 弹出对话框
    QDialog dialog;
    QVBoxLayout layout(&dialog);

    QLabel label("确定要删除任务吗？");

    layout.addWidget(&label);

    // 创建确定和取消按钮
    QDialogButtonBox buttonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);

    connect(&buttonBox, &QDialogButtonBox::accepted, [&]() {    // 连接按钮的点击事件到槽函数
        // 获取选中的条目
        QList<QTreeWidgetItem*> selectedItems = ui->treeWidget->selectedItems();

        // 遍历选中的条目并删除
        foreach (QTreeWidgetItem *item, selectedItems) {
            // 获取条目在 QTreeWidget 中的索引
            int treeIndex = ui->treeWidget->indexOfTopLevelItem(item);

            // 获取对应的页面在 QStackedWidget 中的索引
            int pageIndex = treeIndex + 2;

            // 删除 QTreeWidget 的子条目
            ui->treeWidget->takeTopLevelItem(treeIndex);

            // 删除 QStackedWidget 的页面
            ui->stackedWidget->removeWidget(ui->stackedWidget->widget(pageIndex));
        }

        // 关闭对话框
        dialog.close();
    });

    connect(&buttonBox, &QDialogButtonBox::rejected, [&]() { // 取消按钮被点击，关闭对话框
        dialog.close();
    });

    // 将按钮组添加到布局中
    layout.addWidget(&buttonBox);

    // 显示对话框
    dialog.exec();
}
